2.7 CDN 与流媒体
流媒体已经成为了互联网的一大杀手级应用。
我们来考虑一下视频是如何存储的。一个最简单的想法是,视频就是一系列快速播放的图片。而图片是由大量 <像素位置, 像素颜色> 对组成的文件。不过由于临近的帧可能会有很多像素点没有变化,因此为了压缩占用空间可以对视频进行编码。常见的视频编码方式分为 恒定比特率编码(Constant Byte Rate,CBR) 与 可变比特率编码(Variable Byte Rate,VBR) 两种。一般而言,视频比特率越高,能承载的像素信息越多,视频看起来越清晰。
一种简单的在网络上播放多媒体的方式是下载后播放,即客户端将整个视频文件下载到本地后再进行播放。显然由于视频文件体积很大,下载所需时间很长,难以接受。现在普遍的传输视频的方式是 流化播放。字如其名,将视频文件的传输类比为一个流,客户端与服务器之间建立起连接后客户端请求视频的一部分片段存放在缓存中,当累积的视频内容超过一定阈值后开始播放,啊同时持续向客户端请求后续的视频片段。因此在流式传输下,客户端可以同时请求并播放视频,只请求需要的视频片段。
常见的流式传输方式分为 UDP 流化、HTTP 流化与 基于 HTTP 的动态适应性流(Dynamic Adaptive Streaming over HTTP,DASH) 三种。
HTTP 流化即为基于 HTTP 协议的流式传输。服务器将视频切割成片,每一片都有一个 URL 标识。客户端依据自身需要,对想要获取的视频片段依次发送 HTTP 请求。服务器收到请求后,依据协议规定尽快的将片段发送给客户端。客户端维护一个应用层缓冲区,当缓冲区内积累的内容达到阈值后,开始播放视频。如下图所示:

然而,上图是一个理想化的,具体而言是 假定客户端与服务器之间的吞吐量与传输延迟固定 的。然而在实际的分组交换网络中,上述理想情况很难出现。这就是流式传输在网络上传输时面临的挑战:
- 客户端与服务器间的 延迟、传输速率 会随时间波动。可能会出现丢包、乱序等现象。
- 不同客户端之间的 异质性:传输链路的实际情况存在差别。
- 服务器需要服务的用户数量规模巨大。
我们来逐个考虑上述的问题如何解决:
- 延迟波动:在客户端缓冲区中设置 额外的延迟。延迟大小的选择存在权衡:延迟太大,在客户端开始播放某个分组时还没收到该分组的可能性降低,但用户感知延迟更大;延迟太小则反之。因此采用 自适应延迟,依照前面分组的实际传播延迟,通过一些算法(例如 EWMA)自适应调整后续分组将采用的延迟大小。
- 带宽波动:对于 HTTP 与 DASH 而言,客户端可以监测当前传输速率,在速率高时预先请求更多片段。
- 乱序:在多媒体协议的头部字段中额外添加关于 时间戳、分组序列 的信息方便客户端按正确的顺序重排。
- 丢包:对 UDP 流化而言,客户端直接对文件采用插值、编码、掩盖等方式减少用户感知;对 HTTP 流化与 DASH 而言,TCP 会自动要求重传。
- 客户端的异质性:采用 DASH。其主要思路是: 将每个视频片段编码为多个不同质量的版本。每个片段的每种质量的视频文件被存放在不同的 CDN 节点上,由一条 URL 唯一标识。服务器端维护一个 告示文件(Manifest File),指明不同比特率的视频片段文件的 URL。客户端下载该告示文件,解析后,依照对与服务器间连接带宽的周期性估计,根据需要一次请求一块特定质量的视频文件。在这个过程中,客户端可以动态决定何时请求新的块、切换请求的视频块、请求的服务器。
- 客户数量多:采用 内容分发网络(Content Distribution Network,CDN)。如果仅仅只有一个中心服务器向遍布全球的用户提供服务的话,不可避免会遇到诸如单点故障、通信容量有限、传输距离过远等问题。还是一句话,没有可拓展性。因此 CDN 应运而生。其管理着分布在全球的大量的存储着内容的服务器,并将来自客户端的请求重定向到能够为该客户端提供最好服务的服务器。如果某台服务器宕机或网络链路拥塞,可以将用户重定向到另外一台服务器上。CDN 服务器的两种常见分布分别为:
- Enter-Deep:指在全球中 靠近端系统 的较低层 ISP 中部署服务器。整体而言较为分散,以量优先。
- Bring-Home:在上层 ISP 的 POP、IXP 等关键位置部署集中式的服务器群。
在有了上述解决方案之后,我们来考察客户端在播放一个视频时发生的事情:
- 客户端与服务器建立连接,请求一个视频。
- 服务器返回该视频片段的告示文件。
- 客户端解析该告示文件,依据结果与附近的 CDN 服务器建立连接,请求实际的视频片段文件。
- CDN 服务器返回请求的文件。
- 如果客户端估计与该 CDN 服务器的连接堵塞,可能会断开连接转而与另一台服务器建立连接或请求质量稍差的视频片段文件。
在实际中,内容提供商一般通过 DNS 截获用户向中心服务器发送的内容请求并将用户重定向到选定的为其提供服务的 CDN 服务器上。即,某个指向视频文件的链接实际上可能会被权威 DNS 服务器解析为指向 CDN 权威服务器的主机地址。CDN 有多种集群选择策略用于确定如何为某个用户提供哪台 CDN 服务器。常见的两种策略为 按地理位置 与 CDN 服务器主动向本地 DNS 服务器发送请求测定连接速率。二者各有利弊,前者难以处理用户终端与其对应的 LDNS 相距甚远或地理位置相距较近的服务器跨越的网络链路更长的情况;后者则面对不响应探测报文的 LDNS 束手无策。